perm filename UDPFIL.FAI[KID,KMC] blob
sn#111194 filedate 1974-11-15 generic text, type T, neo UTF8
TITLE UDPFIL
;THIS A NEW VERSION OF THE PROGRAM TO ACCOMODATE DART.
;THE OLD VERSION (FOR OLD DAEMON) IS CALLED UDPFIL.OLD[KID,RCP]
;THIS PROGRAM READS A FILE (SOSFIL) AND COPIES THE MENTIONED SOUND
;FILES ONTO THE UDP FROM EITHER MTA0, MTA1 OR DSK:.
;THE SOS FILE IS JUST A LIST OF FILE NAMES (WITHOUT EXTENSIONS)
;AND THE SOURCE OF FILES IS DETERMINED BY LINESOF THE FORM
; *α (WHERE α=0 ⊃ MTA0
; α=1 ⊃ MTA1
; α=2 ⊃ DSK:)
;ALSO A LINE CONSISTING OF *. MARKS THE END OF THE SOS FILE.
;[INITIALLY THE SOURCE IS MTA0 AND WILL REMAIN SO UNTIL *1 OR *2
;IS ENCOUNTERED.]
FILNAM: 0 ;FILE NAME (IN SIXBIT) TO BE COPIED.
SIXBIT /DMD/
0
0
SOSFNM: SIXBIT /SOSFIL/ ;FILE FOR READING DIRECTIONS
0
0
0
FILDEL: 0 ;IF NONZERO THEN DELETE THE FILE FROM THE AREA
SRCENO: 0 ;0 ⊃ MTA0 ; 1 ⊃ MTA1 ; 2 ⊃ DSK:
PDL: BLOCK 11
IBUF: BLOCK 3
DIOWD: IOWD 0,BUFFER ;FIRST HALF IS OVERWRITTEN
0
LINUM: 0
NOB: 0
FILTH: 0
UDPCHN ←17
SOSFCH ←16
DSKCHN ←15
MTACHN ←14
PAKST←←1
PAKEND←←=3999
A←1
B←2
C←3
P←7
;DSK: ALWAYS ASSIGNED - NO EXPENSE.
START: ;FIRST INIT THE UDP.
INIT UDPCHN,17 ;DUMP MODE IS APPROPRIATE.
SIXBIT /UDP/
0
JRST [OUTSTR [ASCIZ /CANNOT INIT UDP/]
CALL [SIXBIT /EXIT/] ];CANNOT CONTINUE
ENTER UDPCHN,[SIXBIT /KMC/
0
0
0]
JRST [OUTSTR [ASCIZ /CURRENT PAK PROTECTED/]
CALL [SIXBIT /EXIT/]]
;NOW GET THE SOS FILE.
INIT SOSFCH,1
SIXBIT /DSK/
XWD 0,IBUF
JRST [OUTSTR [ASCIZ /CANNOT INIT DSK FOR SOSFIL/]
CALL [SIXBIT /EXIT/] ];CANNOT CONTINUE
LOOKUP SOSFCH,SOSFNM ;SEEK THE FILE
JRST [OUTSTR [ASCIZ /SOSFIL NOT AROUND/]
CALL [SIXBIT /EXIT/] ];GUY MUST CREATE THE SOSFILE
;NOW INITIALISE THE DSK CHANNEL FOR WRITING STUFF FROM TAPE TO THE
;DISK AND ALSO FROM THE DISK TO THE UDP.
INIT DSKCHN,17
SIXBIT /DSK/
0
JRST [OUTSTR [ASCIZ /CANNOT INIT DSK: - THE SYSTEM FILE AREA/]
CALL [SIXBIT /EXIT/] ];GIVE UP
MOVE P,[IOWD 7,PDL]
LOOP: ;LOOP TO OBEY ONE COMMAND OR COPY ONE FILE.
PUSHJ P,INCH
CAIE A,052 ;COMPARE WITH CODE FOR ASTERISK
JRST COPFIL ;NOT ASTERISK SO MUST BE FILE NAME
PUSHJ P,INCH ;GET COMMAND
CAIN A,060
JRST SOURCE ;SOURCE IS MTA0
CAIN A,061
JRST SOURCE ;SOURCE IS MTA1
CAIN A,062
JRST SOURCE ;SOURCE IS DSK:
CAIN A,056
JRST WINDUP ;PERIOD SIGNIFIES END OF SOS FILE.
JRST [OUTSTR [ASCIZ /ILLEGAL COMMAND/]
JRST PRTLNO]
SOURCE: SUBI A,060 ;CONVERT TO 0,1,2
MOVEM A,SRCENO ;SOURCE NUMBER.
PUSHJ P,INCH
CAIE A,012
JRST [OUTSTR [ASCIZ /OVERLENGTH COMMAND/]
JRST PRTLNO]
JRST LOOP
WINDUP: ;END OF SOS FILE REACHED.
;CLOSE SOS FILE
RELEAS SOSFCH
;CLOSE UDP
RELEAS UDPCHN
;CLOSE SYSTEM FILE AREA CHANNEL
RELEAS DSKCHN
CALL [SIXBIT /EXIT/]
COPFIL: ;COPY ONE FILE FROM SOURCE TO UDP.
;START BY READING FILE NAME AND CONVERTING TO SIXBIT.
PUSHJ P,CHKALN ;CHECK THAT THIS CH IS ALPHANUMERIC
LSH A,=30 ;FIRST CHARACTER TO TOP OF WORD.
MOVEM A,FILNAM
MOVEI C,=24 ;MAY LOOP 5 TIMES (DECREMENT = 6).
FNAMLP: PUSHJ P,INCH ;GET NEXT CHAR.
CAIN A,012 ;TEST FOR LINE FEED
JRST FNAMFD ;JUMP OUT OF NAME LOOP AT END OF LINE.
PUSHJ P,CHKALN ;CHECK THAT THIS CH IS ALPHANUMERIC
LSH A,0(C) ;MOVE CHAR UPSTREAM
ORM A,FILNAM ;PUT CHAR IN MEMORY
SUBI C,=6
JUMPGE C,FNAMLP
PUSHJ P,INCH ;GET CHARACTER.
CAIE A,012 ;TEST FOR LINE FEED.
JRST [OUTSTR [ASCIZ /OVERLENGTH FILE NAME/]
JRST PRTLNO]
FNAMFD: SETZM FILDEL ;DONT DELETE UNLESS FILE GETS CREATED.
;NOW BRANCH ON SOURCE.
MOVE A,SRCENO ;GET SOURCE NUMBER.
JUMPE A,MT0FIL
SUBI A,1
JUMPE A,MT1FIL
SUBI A,1
JUMPE A,DSKFIL
CALL [SIXBIT /EXIT/]
MT0FIL: ;FILE IS TO BE FOUND ON MTA0.
INIT MTACHN,117 ;DUMP MODE APPROPRIATE.
;ALSO IONRCK IS SET.
SIXBIT /MTA0/
0
JRST [OUTSTR [ASCIZ /WHAT HAPPENED TO MTA0/]
JRST MT0FIL]
JRST MTREAD
MT1FIL: ;FILE IS TO BE FOUND ON MTA1.
INIT MTACHN,117 ;DUMP MODE APPROPRIATE.
SIXBIT /MTA1/
0
JRST [OUTSTR [ASCIZ /WHAT HAPPENED TO MTA1/]
JRST MT1FIL]
MTREAD: ;READ THE NOMINATED FILE FROM A MAGTAPE.
;A NOTE ON DART TAPE FORMAT:-
;EACH FILE IS A SERIES OF (UP TO) 1280 WORD RECORDS (2400 OCTAL)
;THE FIRST (LAST) RECORD OF EACH TAPE IS A HEADER (TRAILER):
; TOP HALF OF WORD 0 OF HEADERS (TRAILERS) IS POSITIVE.
;THE FIRST RECORD OF EACH FILE IS A FILE-START RECORD.
; THE TOP HALF OF WORD 0 OF FILE-START RECORDS IS -1.
; WORD 2 OF FILE-STARTERS IS THE FILE NAME.
; WORD 3 (TOP) OF FILE-STARTERS IS THE EXTENSION.
;CONTINUATION RECORDS FOR A FILE CONTAIN 0 IN TOP OF WD 0.
;SEEK NEXT FILE-START RECORD.
SETZM BUFFER ;WILL BE OVERWRITTEN BY HEADER.
GETSTS MTACHN,A ;FOR RAIDING
INPUT MTACHN,[IOWD =1280,BUFFER
0]
GETSTS MTACHN,A ;FOR RAIDING
MOVE A,BUFFER+2 ;TEST FOR TAPE TRAILER
CAMN A,[SIXBIT /*TAIL*/]
JRST [OUTSTR [ASCIZ /TRAILER RECORD FOUND/]
CALL [SIXBIT /EXIT/]]
MOVE A,BUFFER ;TEST FOR FILE-STARTER
JUMPGE A,MTREAD
MOVE A,BUFFER+2 ;FILE NAME OF FILE-STARTER
CAME A,FILNAM ;SKIP IF FILE FOUND
JRST MTREAD
;COPY THE FILE FROM MTAPE TO DISK
MOVE A,[SIXBIT /DMD/]
MOVEM A,FILNAM+1
SETZM FILNAM+2
SETZM FILNAM+3
ENTER DSKCHN,FILNAM ;CREATE A FILE
JRST [OUTSTR [ASCIZ /LOUSY FILE NAME - I GUESS/]
JRST PRTLNO ];PRINT LINE NO.
SETOM FILDEL ;FILE CREATED HERE SO DELETE LATER.
;NOW COPY THE FILE ON TAPE INTO THIS FILE.
SETZM SCRPLT ;LENGTH OF SCRAP IS 0
CLOOP: MOVEI A,BUFFER
ADD A,SCRPLT ;DESTINATION ADDRESS.
MOVE B,A
ADDI B,=17 ;WILL OVERWRITE THE 17 JUNK WORDS.
MOVEI C,=1007 ;NO. OF INFO WORDS.
PUSHJ P,MOOV ;MOVE CORE.
MOVEI A,=1007
ADD A,SCRPLT ;NO. OF WORDS OF INFO
IDIVI A,=128 ;COMPUTE NO. OF DISK BLOCKS.
MOVEM B,SCRPLT ;NEW VALUE OF SCRAP LENGTH.
IMULI A,=128 ;NO. OF WORDS TO BE WRITTEN.
MOVEM A,OFFSET ;ADDRESS OF NEW SCRAP
MOVN A,A
HRLM A,DIOWD ;-WORD COUNT.
OUTPUT DSKCHN,DIOWD ;OUTPUT =1024 OR =992 WORDS FROM BUFFER.
MOVEI A,BUFFER ;DESTINATION FOR NEW SCRAP
MOVEI B,BUFFER
ADD B,OFFSET ;SOURCE ADDRESS.
MOVE C,SCRPLT ;NO OF WORDS TO MOVE
PUSHJ P,MOOV ;PUT THE SCRAP AT BUFFER.
MOVEI A,BUFFER-1
ADD A,SCRPLT ;FORM (BUFFER+[SCRAPLENGTH] - 1)
HRRM A,NIOWD ;WILL READ AT THIS LOCATION.
INPUT MTACHN,NIOWD
MOVEI A,BUFFER+=10
ADD A,SCRPLT ;ADDRESS OF FILE NAME.
MOVE A,0(A) ;THE FILE NAME.
CAME A,FILNAM ;TEST FOR CONTINUATION BLOCK.
JRST CLOOPX ;ESCAPE LOOP.
JRST CLOOP
CLOOPX: MOVN A,SCRPLT ;NO OF WORDS IN SCRAP.
ADD A,=128 ;ENSURE PARTIAL DISK BLOCK IS WRITTEN.
HRLM A,DIOWD ;NO. OF WORDS TO WRITE.
OUTPUT DSKCHN,DIOWD ;WRITE SCRAP + SOME JUNK
MTAPE MTACHN,7 ;BACKSPACE A RECORD.
RELEAS MTACHN,0 ;IF WE NEED THIS UNIT LATER IT WILL BE
;RE-ASSIGNED AT THAT TIME.
CLOSE DSKCHN,0
DSKFIL: ;THERE IS A FILE ON THE DISK WITH NAME IN 'FILNAM' WHICH MUST BE COPIED
;ONTO THE UDP AND THEN PERHAPS DELETED.
;LOOKUP THE FILE ON THE SYSTEM FILE AREA
MOVE A,[SIXBIT /DMD/]
MOVEM A,FILNAM+1 ;EXTENSION IS DMD.
SETZM FILNAM+2
SETZM FILNAM+3
LOOKUP DSKCHN,FILNAM
JRST [OUTSTR [ASCIZ /CANNOT FIND FILE ON DISK/]
JRST PRTLNO]
;FIRST 200 WORDS ARE JUNK SO DISCARD ALL EXCEPT
;THE 1ST WHICH CONTAINS THE LENGTH OF THE SOUND INFO.
INPUT DSKCHN,[IOWD 200,BUFFER
0] ;READ THE 1ST 200 WORDS.
MOVE A,BUFFER ;SOUND INFO LENGTH
SUBI A,200
MOVEM A,FILTH ;SAVE FILE LENGTH.
IDIVI A,=2336
SKIPE B ;SKIP IF INFO EVEN NO. OF BLOCKS
ADDI A,1 ;PART OF A BLOCK USES A BLOCK
MOVEM A,NOB ;SAVE NUMBER OF BLOCKS
;NOW CHECK UDP DIRECTORY IS EXPANDABLE.
INPUT UDPCHN,[IOWD =2336,DIRECT
PAKST]
;THE FIRST WORD OF THE DIRECTORY IS THE NO. OF ENTRIES.
;THE SECOND CONTAINS THE DATE LAST WRITTEN.
;THE THIRD WORD GIVES NEXT AVAILABLE BLOCK NUMBER
;THE FOURTH WORD IS SPARE.
;THUS WORDS 4 THRU 2335 ARE FOR AT MOST 1165 ENTRIES.
;THE 2 WORD ENTRY FORMAT IS AS FOLLOWS:-
; 1ST WORD - FILENAME.
; 2ND WORD (TOP) - FILE LENGTH
; 2ND WORD (BOTTOM) - STARTING BLOCK NUMBER.
MOVE A,DIRECT ;NO. OF ENTRIES
CAIL A,=1164 ;TEST FOR OVERFLOW
JRST [OUTSTR [ASCIZ /UDP FULL/]
JRST PRTLNO]
MOVE B,DIRECT+2 ;THIRD WORD (NEXT FREE BLOCK)
ADD B,NOB ;WILL BE NEW VALUE SOON
CAIL B,PAKEND ;WILL NOT FILL LAST BLOCK
JRST [OUTSTR [ASCIZ /UDP WILL OVERFLOW/]
JRST PRTLNO]
;EXPAND THE UDP DIRECTORY.
ADDI A,1
MOVEM A,DIRECT ;UPDATE NO OF ENTRIES.
LSH A,1 ;DOUBLE THIS NUMBER TO GET WORD COUNT.
ADDI A,2 ;GET ADDRESS OF NEXT ENTRY.
MOVE B,FILNAM ;NAME OF NEW FILE.
MOVEM B,DIRECT(A) ;NAME IS FIRST WORD OF NEW ENTRY.
MOVE B,DIRECT+2 ;STARTING BLOCK
HRL B,FILTH ;GET FILE LENGTH
MOVEM B,DIRECT+1(A) ;SECOND WORD OF NEW FILE ENTRY
MOVE B,DIRECT+2 ;STARTING BLOCK
MOVEM B,UDPBNO ;MAKE COPY
ADDI B,1
MOVEM B,UDPBN2
ADDI B,1
MOVEM B,UDPBN3
ADDI B,1
MOVEM B,UDPBN4
MOVE A,NOB ;NUMBER OF BLOCKS USED BY THIS FILE.
ADDM A,DIRECT+2 ;UPDATE THIRD WORD OF DIRECTORY.
CALL A,[SIXBIT /DATE/]
MOVEM A,DIRECT+1 ;UPDATE DATE
;THE NEW VERSION OF THE DIRECTORY IS DONE BUT WILL NOT
;BE COMMITTED TO UDP UNTIL THE FILE IS SUCCESSFULLY OUT.
;PREPARE TO LOOP ([NOB]-1)/4 TIMES TO WRITE X BLOCKS.
; WHERE X = ([NOB]-1)/4 *4.
MOVE A,NOB
SUBI A,1
LSH A,-2 ;DIVIDE BY 4
JRST WLOOPX
WLOOP: INPUT DSKCHN,[IOWD =9344,BUFFER
0]
OUTPUT UDPCHN,UDPIOW
OUTPUT UDPCHN,UDPIO2
OUTPUT UDPCHN,UDPIO3
OUTPUT UDPCHN,UDPIO4
SUBI A,1 ;DECREMENT LOOP COUNT
MOVEI B,4
ADDM B,UDPBNO ;BUMP THE BLOCK NUMBER
ADDM B,UDPBN2 ;BUMP THE OTHER BLOCK NUMBERS
ADDM B,UDPBN3 ;BUMP THE OTHER BLOCK NUMBERS
ADDM B,UDPBN4 ;BUMP THE OTHER BLOCK NUMBERS
MOVE B,FILTH ;LENGTH YET TO WRITTEN
SUBI B,=9344 ;UPDATE
MOVEM B,FILTH ;PUT IT WHERE IT COUNTS.
WLOOPX: JUMPG A,WLOOP
;FALLS THRU WHEN (([NOB]-1 )/ 4)* 4 BLOCKS HAVE BEEN WRITTEN.
;THERE ARE AT MOST 4 BLOCKS YET TO WRITE.
SETZM BUFFER
MOVEI 0,BUFFER+1
HRLI 0,BUFFER
BLT 0,BUFFER+=9344 ;ZERO BUFFER
MOVN A,FILTH ;NUMBER OF WORDS LEFT.
HRLM A,DIOWD ;CUSTOM BUILT IOWD.
MOVE A,FILTH ;NO. OF WORDS TO BE WRITTEN.
INPUT DSKCHN,DIOWD
OUTPUT UDPCHN,UDPIOW
SUBI A,=2336 ;2336 WORDS WERE JUST SCRAWLED.
JUMPLE A,ALLOUT
OUTPUT UDPCHN,UDPIO2 ;NEXT 2336 WORDS.
SUBI A,=2336 ;2336 WORDS WERE JUST SCRAWLED.
JUMPLE A,ALLOUT
OUTPUT UDPCHN,UDPIO3 ;NEXT 2336 WORDS.
SUBI A,=2336 ;2336 WORDS WERE JUST SCRAWLED.
JUMPLE A,ALLOUT
OUTPUT UDPCHN,UDPIO4 ;NEXT 2336 WORDS.
ALLOUT: ;WHEN CONTROL FALLS THRU THE FILE HAS BEEN COPIED TO THE UDP
OUTPUT UDPCHN,[IOWD =2336,DIRECT
PAKST] ;WRITE NEW COPY OF DIRECTORY
;NOW DECIDE ON DELETING THE DISK VERSION OF THE FILE.
MOVE FILDEL
JUMPE .+3 ;SKIP IF NOT TO BE DELETED.
RENAME DSKCHN,[0↔0↔0↔0]
JRST [OUTSTR [ASCIZ /RENAME DISASTER/]
CALL [SIXBIT /EXIT/]]
CLOSE DSKCHN,0
JRST LOOP ;GO GET NEXT COMMAND.
PRTLNO: ;PRINT LINE NUMBER AND FAIL.
MOVEI A,040 ;SPACE
OUTCHR A
OUTCHR A
MOVE A,LINUM
IDIVI A,=10000
ADDI A,060
OUTCHR A
MOVE A,B
IDIVI A,=1000
ADDI A,060
OUTCHR A
MOVE A,B
IDIVI A,=100
ADDI A,060
OUTCHR A
MOVE A,B
IDIVI A,=10
ADDI A,060
OUTCHR A
MOVE A,B
ADDI A,060
OUTCHR A
CALL [SIXBIT /EXIT/]
INTMP: 0 ;NONZERO WHEN THE LINE NUMBER HAS BEEN FOUND.
INCH: ;SUBROUTINE TO READ ONE CHARACTER FROM THE SOS FILE.
;THIS FILE SHOULD HAVE LINE NUMBERS TERMINATED BY A TAB
;(ie BE A GARDEN VARIETY SOS FILE).
PUSHJ P,INCH8
CAIE A,012 ;TEST FOR LINE FEED.
JRST .+3 ;NORMAL CHARACTER.
SETZM INTMP
POPJ P, ;EXIT.
SKIPE INTMP
POPJ P, ;EXIT FOR ANY CHAR AFTER LINE NUMBER.
;THE CHAR IN A SHOULD BE THE FIRST DIGIT OF A LINE NUMBER.
PUSHJ P,CHKDIG
MOVEM A,LINUM
NUMLP: PUSHJ P,INCH8 ;NEXT CHAR
CAIN A,011 ;TEST FOR TAB
JRST FOUND
PUSHJ P,CHKDIG ;CHECK FOR DIGIT (AND RECODE)
MOVEI B,=10
IMUL B,LINUM ;MULTIPLY LAST PARTIAL LINE NO. BY 10
ADD A,B
MOVEM A,LINUM ;NEW PARTIAL LINE NUMBER.
JRST NUMLP
FOUND: ;LINUM CONTAINS THE LINE NUMBER.
SETOM INTMP ;INDICATE LINE NUMBER FOUND.
JRST INCH ;TRY AGAIN.
INCH8: ;READ A CHARACTER FROM SOSFCH.
SOSG IBUF+2
IN SOSFCH,
JRST INCH9
STATO SOSFCH,20000 ;TEST FOR ENDFILE.
JRST [OUTSTR [ASCIZ /HARDWARE FAILURE READING SOSFIL/]
CALL [SIXBIT /EXIT/]]
OUTSTR [ASCIZ /ENDFILE DETECTED ON SOSFIL/]
CALL [SIXBIT /EXIT/]
INCH9: ILDB A,IBUF+1
CAIN A,015 ;TEST FOR CARRIAGE RETURN CHARACTER.
JRST INCH8 ;FOUND SO GET NEXT.
JUMPE A,INCH8 ;GET NEXT IF TXIS IS NULL CHARACTER.
POPJ P, ;ELSE DELCLARE VICTORY AND QUIT.
CHKDIG: ;CHECK CHAR IN A IS A DIGIT AND RECODE SO CODE(0)=0.
SUBI A,060 ;RECODE.
JUMPL A,NOTDIG ;IF A < 0 THEN ORIG CHAR WAS NOT DIGIT.
CAILE A,=9
JRST NOTDIG ;A>9 SO ORIG CHAR WAS NOT DIGIT.
POPJ P, ;GET OUT
NOTDIG: OUTSTR [ASCIZ /BAD LINE NUMBER/]
CALL [SIXBIT /EXIT/]
CHKALN: ;CHECK CHAR IN A IS ALPHANUMERIC AND RECODE TO SIXBIT.
SUBI A,040 ;RECODE.
CAIGE A,020 ;TEST AGAINST RECODED 0.
JRST NOTALN
CAIG A,031 ;TEST AGAINST RECODED 9.
JRST ISALN
CAIGE A,041 ;TEST AGAINST RECODED A.
JRST NOTALN
CAIG A,072 ;TEST AGAINST RECODED R.
JRST ISALN
NOTALN: OUTSTR [ASCIZ /NONALPHANUMERIC CHAR IN NAME/]
JRST PRTLNO
ISALN: POPJ P, ;DECLARE VICTORY AND GET OUT.
MOOV: ;MOVE THE BLOCK OF WORDS WHOSE LENGTH IS GIVEN IN C
;FROM THE ADDRESS IN B DOWN CORE TO THE ADDRESS IN A.
JUMPLE C,MOOVX ;EXIT IS NO WORDS LEFT.
MOVE 0,0(B) ;GET NEXT
MOVEM 0,0(A) ;PUT IT
ADDI A,1
ADDI B,1 ;BOTH POINTERS INCREMENTED.
SUBI C,1 ;DECREMENT COUNT
JRST MOOV ;CONTINUE TO LOOP
MOOVX: POPJ P, ;EXIT
DIRECT: BLOCK =2594 ;1 UDP BLOCK + 2 WDS
BUFFER: BLOCK =9346 ;4 UDP BLOCK + 2 WDS
SCRPLT: 0 ;CONTAINS LENGTH OF LEFTOVERS.
OFFSET: 0 ;GIVES LOCATION OF SCRAPS.
NIOWD: IOWD =1024,0 ;ADDRESS WILL BE COMPUTED.
0
UDPIOW: IOWD =2336,BUFFER
UDPBNO: 0 ;CURRENT BLOCK NUMBER.
UDPIO2: IOWD =2336,BUFFER+=2336
UDPBN2: 0
UDPIO3: IOWD =2336,BUFFER+=4672
UDPBN3: 0
UDPIO4: IOWD =2336,BUFFER+=7008
UDPBN4: 0
END START